package simple;

import com.rabbitmq.client.*;
import config.RabbitMqConnection;
import org.junit.Test;

import java.io.IOException;

/**
 * @description: 消息订阅者（消费者）,需要一直监听
 * @author:刘腾辉
 * @create:2020/10/20 9:45
 */
public class Consumer {
    @Test
    public void subscribe() throws Exception {
        /**
         * 1.获取连接
         */
        Connection rabbitMqConnection = RabbitMqConnection.getRabbitMqConnection();

        /**
         * 2.创建 channel
         */
        Channel channel = rabbitMqConnection.createChannel();

        /**
         * 3.声明队列
         * queue：队列名称
         * durable：是否持久化
         * exclusive：是否排外（独占），当前队列会被自动删除，当前队列只能被一个消费者消费
         * autoDelete：如果该队列没有消费者在消费，队列自动删除
         * arguments：指定队列其他信息
         */
        channel.queueDeclare("HelloWorld", true, false, false, null);

        /**
         * 4.监听队列
         */
        System.out.println("消费者正在监听......");
        DefaultConsumer consumer = new DefaultConsumer(channel){
            /**
             * 消费的回调函数
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("接收到消息："+new String(body,"UTF-8"));
            }
        };

        /**监听队列
         * queue：队列名称
         * autoAck：是否自动回复
         * consumer：自动的消费回调
         */
        channel.basicConsume("HelloWorld",true ,consumer);

        /**
         * 保持一直监听
         */
        System.in.read();

        /**
         * 5.释放资源
         */
        channel.close();
        rabbitMqConnection.close();

    }
}
